// 泛型 创建一个函数
// function id<Type>(value: Type): Type {
//   return value
// }

// // number类型
// id<number>(10)
// // string类型
// id<string>('aaa')
// // 布尔类型
// id<boolean>(false)


// interface ILength { length: number }
// function id<Type extends ILength>(value: Type): Type {
//   console.log(value.length)
//   return value
// }

// function getProp<Type, Key extends keyof Type>(obj: Type, key: Key) {
//   return obj[key]
// }

// getProp({ name: 'za', age: 18 }, 'name')

// 泛型接口
// interface idFunc<Type> {
//   id: (value: Type) => Type
//   ids: () => Type[]
// }

// let obj1: idFunc<number> = {
//   id: (value) => { return value },
//   ids() { return [1, 2, 3] }
// }

// 泛型类
// class GenericNumber<NumType> {
//   defaultValue: NumType
//   add: (x: NumType, y: NumType) => NumType
// }

// const myNum = new GenericNumber<number>()
// myNum.defaultValue = 10



class GenericNumber<NumType> {
  defaultValue: NumType
  add: (x: NumType, y: NumType) => NumType
  constructor(value: NumType, add: (x: NumType, y: NumType) => NumType) {
    this.add = add
    this.defaultValue = value
  }
}

const myNum = new GenericNumber<number>(100, (x, y) => { return x + y })

const result = myNum.add(1, 1)
console.log(result)